package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.Area;
import com.app.sgd.model.bean.Documento;
import com.app.sgd.model.bean.DocumentoOrdenEnvio;
import com.app.sgd.model.bean.ReporteSalidaDocumentos;
import com.app.sgd.plugin.JNDIConnector;
import com.app.sgd.util.Constants;
import com.app.sgd.util.Util;
import com.app.sgd.view.vo.FiltroBusquedaVO;

public class SQLReporteDAO {
	private static Logger logger = Logger.getLogger(SQLReporteDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
//	public ArrayList listarDocumentosPlazo(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
//		ArrayList lstDocumentosPlazo = new ArrayList();
//		Connection conn = null;
//		PreparedStatement pre = null;
//		CallableStatement call = null;
//		ResultSet rs = null;
//		try{
//			conn = cn.connect().getConnection();
//	    	
//	    	String vSQL = "{call std_sp_reporte_docs_por_vencer(?,?,?,?,?)}";
//	    	call = conn.prepareCall(vSQL);
//            call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodTipoMovimiento()));
//            call.setInt(2,Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
//            call.setString(3, filtroBusquedaVO.getFechaInicio());
//            call.setString(4, filtroBusquedaVO.getFechaFin());
//            call.setString(5, filtroBusquedaVO.getFechaProceso());
//            logger.info("inicio:" + new Date());
//            rs = call.executeQuery();
//            logger.info("fin: " + new Date());
//            int ind=0;
//            while(rs.next()){
//            	ReportePlazos reportePlazos = new ReportePlazos();
//            	reportePlazos.setIndiceDocumento(String.valueOf(ind++));
//            	reportePlazos.setCodDocumento(rs.getString("CODI_DOC_TDOC"));
//            	reportePlazos.setCodSeguimiento(rs.getString("CODI_SEG_TSEG"));
//            	reportePlazos.setFechaDocumento(rs.getString("FECH_DOC_TDOC"));
//            	reportePlazos.setCodTipoMovimiento(rs.getString("CODI_TMOV_TTM"));
//            	reportePlazos.setCodTipoDocumento(rs.getString("CODI_TDOC_TTD"));
//            	reportePlazos.setDescTipoDocumento(rs.getString("DESC_CORTO_TTD"));
//            	reportePlazos.setNumDocumento(rs.getString("NUM_DOC_TDOC"));
//            	reportePlazos.setAsuntoDocumento(rs.getString("ASUN_DOC_TDOC"));
//            	reportePlazos.setFechaVencimiento(rs.getString("FECH_VENC_TDOC"));
//            	reportePlazos.setEmisorDocumento(rs.getString("NOM_EMI_TDOC"));
//            	reportePlazos.setDestinoDocumento(rs.getString("NOM_DEST_TDOC"));
//            	reportePlazos.setEmpDestinoDocumento(rs.getString("EMP_DEST_TSEG"));
//            	reportePlazos.setDiasPlazo(rs.getString("NUM_PLZ_TDOC"));
//            	reportePlazos.setCodPlazo(rs.getString("CODI_PLZ_TPLZ"));
//            	reportePlazos.setDiasPlazoCal(rs.getString("NUM_DIAS_VENC_CAL"));
//            	reportePlazos.setDiasPlazoUti(rs.getString("NUM_DIAS_VENC_UTIL"));
//            	reportePlazos.setDiasParaVenc(rs.getString("NUM_DIAS_X_VENC"));
//            	reportePlazos.setCodEstado(rs.getString("CODI_EDOC_TED"));
//            	reportePlazos.setDescEstado(rs.getString("DESC_EDOC_TES"));
//
//            	lstDocumentosPlazo.add(reportePlazos);
//            }
//		}catch(Exception e){
//			logger.error("[STD]: Error en listarDocumentosPlazo: " + e.getMessage());
//            e.printStackTrace();
//		}
//		finally{
//			cn.destroy(conn,null,rs,call,pre);
//		}
//		return lstDocumentosPlazo;
//	}
	
	
	public ArrayList listarDocumentosSalidaAreas(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentosSalida = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_reporte_salida_docs(?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setString(1, filtroBusquedaVO.getFechaInicio());
            call.setString(2, filtroBusquedaVO.getFechaFin());
            call.setInt(3,Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
            call.setInt(4,Integer.parseInt(filtroBusquedaVO.getCodOficina()));
            call.setInt(5,Integer.parseInt(filtroBusquedaVO.getCodEmpleado()));
            
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            int ind=1;
            while(rs.next()){
            	ReporteSalidaDocumentos reporteSalidaDocumentos = new ReporteSalidaDocumentos();
            	reporteSalidaDocumentos.setIndiceDocumento(String.valueOf(ind++));
            	reporteSalidaDocumentos.setCodDocumento(rs.getString("CODI_DOC_TDOC"));
            	reporteSalidaDocumentos.setCodSeguimiento(rs.getString("CODI_SEG_TSEG"));
            	reporteSalidaDocumentos.setFechaDocumento(rs.getString("FECH_DOC_TDOC"));
            	reporteSalidaDocumentos.setCodTipoDocumento(rs.getString("CODI_TDOC_TTD"));
            	reporteSalidaDocumentos.setDescTipoDocumento(rs.getString("DESC_TDOC_TTD"));
            	reporteSalidaDocumentos.setNumDocumento(rs.getString("NUM_DOC_TDOC"));
            	reporteSalidaDocumentos.setAsuntoDocumento(rs.getString("ASUN_DOC_TDOC"));
            	reporteSalidaDocumentos.setEmisorDocumento(rs.getString("EMP_EMI_TSEG"));
            	reporteSalidaDocumentos.setDestinoDocumento(rs.getString("NOM_DEST_TSEG"));
            	reporteSalidaDocumentos.setEmpDestinoDocumento(rs.getString("EMP_DEST_TSEG"));
            	reporteSalidaDocumentos.setFechaCreacion(rs.getString("FECH_CREA_TDOC"));
            	reporteSalidaDocumentos.setNroRegistro(rs.getString("NRO_REG_TDOC"));
            	reporteSalidaDocumentos.setFlgRespuesta(rs.getString("FLG_RESP_TDOC"));
            	reporteSalidaDocumentos.setSiglasArea(rs.getString("SIG_ARE"));
            	reporteSalidaDocumentos.setNumeroExpediente(rs.getString("NUM_DOC_TEXP"));
            	
            	lstDocumentosSalida.add(reporteSalidaDocumentos);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarDocumentosSalidaAreas: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentosSalida;
	}
	
	public ArrayList listarDocumentosSalidaFechaEnvio(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentosSalida = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_reporte_docs_fecha_envio(?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setString(1, filtroBusquedaVO.getFechaInicio());
            call.setString(2, filtroBusquedaVO.getFechaFin());
            call.setInt(3,Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
            call.setInt(4,Integer.parseInt(filtroBusquedaVO.getCodOficina()));
            call.setInt(5,Integer.parseInt(filtroBusquedaVO.getCodEmpleado()));
            
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            int ind=1;
            while(rs.next()){
            	ReporteSalidaDocumentos reporteSalidaDocumentos = new ReporteSalidaDocumentos();
            	reporteSalidaDocumentos.setIndiceDocumento(String.valueOf(ind++));
            	reporteSalidaDocumentos.setCodDocumento(rs.getString("CODI_DOC_TDOC"));
            	reporteSalidaDocumentos.setCodSeguimiento(rs.getString("CODI_SEG_TSEG"));
            	reporteSalidaDocumentos.setFechaDocumento(rs.getString("FECH_DOC_TDOC"));
            	reporteSalidaDocumentos.setFechaEnvio(rs.getString("FECH_ENV_TDOC"));
            	reporteSalidaDocumentos.setCodTipoDocumento(rs.getString("CODI_TDOC_TTD"));
            	reporteSalidaDocumentos.setDescTipoDocumento(rs.getString("DESC_TDOC_TTD"));
            	reporteSalidaDocumentos.setNumDocumento(rs.getString("NUM_DOC_TDOC"));
            	reporteSalidaDocumentos.setAsuntoDocumento(rs.getString("ASUN_DOC_TDOC"));
            	reporteSalidaDocumentos.setEmisorDocumento(rs.getString("EMP_EMI_TSEG"));
            	reporteSalidaDocumentos.setDestinoDocumento(rs.getString("NOM_DEST_TSEG"));
            	reporteSalidaDocumentos.setEmpDestinoDocumento(rs.getString("EMP_DEST_TSEG"));
            	reporteSalidaDocumentos.setFechaCreacion(rs.getString("FECH_CREA_TDOC"));
            	reporteSalidaDocumentos.setNroRegistro(rs.getString("NRO_REG_TDOC"));
            	reporteSalidaDocumentos.setFlgRespuesta(rs.getString("FLG_RESP_TDOC"));
            	reporteSalidaDocumentos.setSiglasArea(rs.getString("SIG_ARE"));
            	reporteSalidaDocumentos.setNumeroExpediente(rs.getString("NUM_DOC_TEXP"));
            	
            	lstDocumentosSalida.add(reporteSalidaDocumentos);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarDocumentosSalidaAreas: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentosSalida;
	}
	
	public ArrayList listarDocumentosRecepcionAreas(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentosSalida = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_reporte_recepcion_docs(?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodTipoMovimiento()));
	    	call.setString(2, filtroBusquedaVO.getFechaInicio());
            call.setString(3, filtroBusquedaVO.getFechaFin());
            call.setInt(4,Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
            call.setInt(5,Integer.parseInt(filtroBusquedaVO.getCodOficina()));
//            call.setInt(5,Integer.parseInt(filtroBusquedaVO.getCodEmpleado()));
            
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            int ind=1;
            while(rs.next()){
            	ReporteSalidaDocumentos reporteSalidaDocumentos = new ReporteSalidaDocumentos();
            	reporteSalidaDocumentos.setIndiceDocumento(String.valueOf(ind++));
            	reporteSalidaDocumentos.setCodDocumento(rs.getString("CODI_DOC_TDOC"));
            	reporteSalidaDocumentos.setCodSeguimiento(rs.getString("CODI_SEG_TSEG"));
            	reporteSalidaDocumentos.setFechaDocumento(Util.getStrAsDate(rs.getString("FECH_DOC_TDOC")));
            	reporteSalidaDocumentos.setCodTipoDocumento(rs.getString("CODI_TDOC_TTD"));
            	reporteSalidaDocumentos.setDescTipoDocumento(rs.getString("DESC_TDOC_TTD"));
            	reporteSalidaDocumentos.setNumDocumento(rs.getString("NUM_DOC_TDOC"));
            	reporteSalidaDocumentos.setAsuntoDocumento(rs.getString("ASUN_DOC_TDOC"));
            	reporteSalidaDocumentos.setEmisorDocumento(rs.getString("NOM_EMI_TSEG"));
            	reporteSalidaDocumentos.setEmpEmisorDocumento(rs.getString("EMP_EMI_TSEG"));
            	reporteSalidaDocumentos.setDestinoDocumento(rs.getString("NOM_DEST_TSEG"));
            	reporteSalidaDocumentos.setEmpDestinoDocumento(rs.getString("EMP_DEST_TSEG"));
            	reporteSalidaDocumentos.setFechaCreacion(Util.getStrAsDate(rs.getString("FECH_CREA_TDOC")));
            	reporteSalidaDocumentos.setNroRegistro(rs.getString("NRO_REG_TDOC"));
            	reporteSalidaDocumentos.setFlgRespuesta(rs.getString("FLG_RESP_TDOC"));
            	reporteSalidaDocumentos.setDescEstado(rs.getString("DESC_EDOC_TES"));
            	reporteSalidaDocumentos.setSiglasArea(rs.getString("SIG_ARE"));
            	reporteSalidaDocumentos.setNumeroExpediente(rs.getString("NUM_DOC_TEXP"));
            	
            	lstDocumentosSalida.add(reporteSalidaDocumentos);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarDocumentosRecepcionAreas: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentosSalida;
	}
	
	
	public ArrayList listarDocumentosCargosAreas(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentosCargos = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_reporte_recepcion_cargos(?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setString(1, filtroBusquedaVO.getFechaInicio());
            call.setString(2, filtroBusquedaVO.getFechaFin());
            call.setInt(3,Integer.parseInt(filtroBusquedaVO.getCodOficina()));
            
//            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
//            logger.info("fin: " + new Date());
            int ind=1;
            while(rs.next()){
            	DocumentoOrdenEnvio documentoOrdenEnvio = new DocumentoOrdenEnvio();
            	documentoOrdenEnvio.setIndiceDocumento(String.valueOf(ind++));
            	documentoOrdenEnvio.setCodOrdenEnvio(rs.getString("Id"));
            	documentoOrdenEnvio.setCodSeguimiento(rs.getString("IdSeg"));
            	documentoOrdenEnvio.setCodDocumento(rs.getString("IdDoc"));
            	documentoOrdenEnvio.setCodDocumentoCargo(rs.getString("IdDocCargo"));
            	documentoOrdenEnvio.setFlgCargo(rs.getString("Cargo"));
            	documentoOrdenEnvio.setNumDocumento(rs.getString("NumDoc"));
            	documentoOrdenEnvio.setNumRegistro(rs.getString("NroRegDoc"));
            	documentoOrdenEnvio.setDescTipoDocumento(rs.getString("Tipo"));
            	documentoOrdenEnvio.setFechaRecepcion(rs.getString("FechaRecepcion"));
            	documentoOrdenEnvio.setHoraRecepcion(rs.getString("HoraRecepcion"));
            	documentoOrdenEnvio.setNumUsuarioSeguimiento(rs.getString("NroFilaSeg"));
            	documentoOrdenEnvio.setFechaCreacion(rs.getString("fechaCreacion"));
            	documentoOrdenEnvio.setHoraCreacion(rs.getString("horaCreacion"));
            	documentoOrdenEnvio.setAsunto(rs.getString("asunto"));
            	documentoOrdenEnvio.setFechaEnvio(rs.getString("fechaEnvio"));
            	documentoOrdenEnvio.setFechaDocumento(rs.getString("fechaDocumento"));
            	documentoOrdenEnvio.setObservaciones(rs.getString("observaciones"));
            	documentoOrdenEnvio.setCodExpedienteBCA(rs.getString("codExpedienteBCA"));
            	documentoOrdenEnvio.setNumExpedienteBCA(rs.getString("numExpedienteBCA"));
            	documentoOrdenEnvio.setNombreEntidadDestino(rs.getString("entidadDestino"));
            	documentoOrdenEnvio.setSigEntidadEmisor(rs.getString("siglasArea"));
            	documentoOrdenEnvio.setFechaRegistro(rs.getString("fechaRegistro"));
            	documentoOrdenEnvio.setDescEstado(rs.getString("descEstado"));
            	documentoOrdenEnvio.setObsAdiCargo(rs.getString("obsAdiCargo"));
            	documentoOrdenEnvio.setNumeroExpediente(rs.getString("numeroExpediente"));
            	lstDocumentosCargos.add(documentoOrdenEnvio);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarDocumentosCargosAreas: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentosCargos;
	}
	
	public ArrayList obtenerOficinasReportes(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstOficinas = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null; 
		ResultSet rs = null;
	    try{
	    	conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_get_oficinas_reporte(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";

	    	call = conn.prepareCall(vSQL);
            call.setString(1, filtroBusquedaVO.getFechaInicio());
            call.setString(2, filtroBusquedaVO.getFechaFin());
            call.setInt(3, Integer.parseInt(filtroBusquedaVO.getEstadoDocumento()));
            call.setInt(4, Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
	    	call.setInt(5, Integer.parseInt(filtroBusquedaVO.getCodTipoMovimiento()));
            call.setString(6, filtroBusquedaVO.getFlgAnulado());
        	call.setString(7, filtroBusquedaVO.getNombreClienteOrigen().toUpperCase());
        	call.setString(8, filtroBusquedaVO.getEmpleadoClienteOrigen().toUpperCase());
        	call.setInt(9, Integer.parseInt(filtroBusquedaVO.getCodigoOficinaOrigen()));
        	call.setInt(10, Integer.parseInt(filtroBusquedaVO.getCodigoEmpleadoOficinaOrigen()));
        	call.setString(11, filtroBusquedaVO.getNombreClienteDestino().toUpperCase());
        	call.setString(12, filtroBusquedaVO.getEmpleadoClienteDestino().toUpperCase());
        	call.setInt(13, Integer.parseInt(filtroBusquedaVO.getCodigoOficinaDestino()));
        	call.setInt(14, Integer.parseInt(filtroBusquedaVO.getCodigoEmpleadoOficinaDestino()));
        	call.setString(15, filtroBusquedaVO.getVista());
        	
            rs = call.executeQuery();

            while(rs.next()){
            	Area area = new Area();
            	area.setCodigo(rs.getString("codOficina"));
            	area.setNombre(rs.getString("nombreArea"));
            	area.setCodigoSIG(rs.getString("siglasArea"));
            	lstOficinas.add(area);
            }
        }
        catch(Exception e)
        {
        	logger.error("[STD]: Error en obtenerOficinasReportes: " + e.getMessage());
            e.printStackTrace();
        }
        finally
	    {   
        	cn.destroy(conn,null,rs,call,pre);
	    }
		return lstOficinas;
	}
	
	public ArrayList listarReporteDocumentos(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentos = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null; 
		ResultSet rs = null;
	    try{
	    	
	    	conn = cn.connect().getConnection();
	    	
	    	String vSQL = "";
	    	
	    	if (filtroBusquedaVO.getVista().equals(Constants.VISTA_RECIBIDOS))
				vSQL = "{call std_sp_reporte_docs_recibidos(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
			else if (filtroBusquedaVO.getVista().equals(Constants.VISTA_ENVIADOS))
				vSQL = "{call std_sp_reporte_docs_enviados(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"; //,?,?,?,?
			else if (filtroBusquedaVO.getVista().equals(Constants.VISTA_POR_ENVIAR))
				vSQL = "{call std_sp_reporte_docs_por_enviar(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"; //,?,?,?,?
	    	
	    	
	    	String codigoEmpleadoOficinaOrigen = filtroBusquedaVO.getCodigoEmpleadoOficinaOrigen();
	    	String codigoEmpleadoOficinaDestino = filtroBusquedaVO.getCodigoEmpleadoOficinaDestino();
	    	String codAuxOri = Constants.VALOR_DEFAULT_CERO;
    		String codEmpleadoOri = Constants.VALOR_DEFAULT_CERO;
    		String codUsuarioOri  = Constants.VALOR_DEFAULT_CERO;
    		String codOficinaOri  = Constants.VALOR_DEFAULT_CERO;
    		String codEncargaturaOri  = Constants.VALOR_DEFAULT_CERO;
    		String codAuxDest = Constants.VALOR_DEFAULT_CERO;
    		String codEmpleadoDest = Constants.VALOR_DEFAULT_CERO;
    		String codUsuarioDest  = Constants.VALOR_DEFAULT_CERO;
    		String codOficinaDest  = Constants.VALOR_DEFAULT_CERO;
    		String codEncargaturaDest  = Constants.VALOR_DEFAULT_CERO;
    		
    		if(!codigoEmpleadoOficinaOrigen.equals(Constants.VALOR_DEFAULT_CERO)){
    			codAuxOri = codigoEmpleadoOficinaOrigen.substring(codigoEmpleadoOficinaOrigen.indexOf("#")+1,codigoEmpleadoOficinaOrigen.lastIndexOf("#"));
	    		codEmpleadoOri = codAuxOri.substring(0,codAuxOri.indexOf("#"));
	    		codUsuarioOri  = codAuxOri.substring(codAuxOri.lastIndexOf("#")+1);
	    		codOficinaOri  = codigoEmpleadoOficinaOrigen.substring(0,codigoEmpleadoOficinaOrigen.indexOf("#"));
	    		codEncargaturaOri  = codigoEmpleadoOficinaOrigen.substring(codigoEmpleadoOficinaOrigen .lastIndexOf("#")+1);
    		}
    		if(!codigoEmpleadoOficinaDestino.equals(Constants.VALOR_DEFAULT_CERO)){
    			codAuxDest = codigoEmpleadoOficinaDestino.substring(codigoEmpleadoOficinaDestino.indexOf("#")+1,codigoEmpleadoOficinaDestino.lastIndexOf("#"));
    			codEmpleadoDest = codAuxDest.substring(0,codAuxDest.indexOf("#"));
    			codUsuarioDest  = codAuxDest.substring(codAuxDest.lastIndexOf("#")+1);
    			codOficinaDest  = codigoEmpleadoOficinaDestino.substring(0,codigoEmpleadoOficinaDestino.indexOf("#"));
    			codEncargaturaDest  = codigoEmpleadoOficinaDestino.substring(codigoEmpleadoOficinaDestino .lastIndexOf("#")+1);
    		}
	    	
	    	int ind=1;
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getFlgBusquedaAvanzada()));
            call.setString(ind++, filtroBusquedaVO.getFechaInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaFin());
            call.setString(ind++, filtroBusquedaVO.getFechaCreacionInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaCreacionFin());
            call.setString(ind++, filtroBusquedaVO.getFechaEnvioInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaEnvioFin());
            call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getEstadoDocumento()));
            call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodTipoMovimiento()));
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getNumProveido()));
	    	call.setString(ind++, filtroBusquedaVO.getNumDocumento().trim().toUpperCase());
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodControlManual()));
            call.setString(ind++, filtroBusquedaVO.getFlgAnulado());
        	call.setString(ind++, filtroBusquedaVO.getNombreClienteOrigen().toUpperCase());
        	call.setString(ind++, filtroBusquedaVO.getEmpleadoClienteOrigen().toUpperCase());
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoOficinaOrigen()));
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoEmpleadoOficinaOrigen()));
        	call.setString(ind++, filtroBusquedaVO.getNombreClienteDestino().toUpperCase());
        	call.setString(ind++, filtroBusquedaVO.getEmpleadoClienteDestino().toUpperCase());
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoOficinaDestino()));
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoEmpleadoOficinaDestino()));
        	call.setString(ind++, filtroBusquedaVO.getAsunto().trim().toUpperCase());
    		call.setInt(ind++, Integer.parseInt(codUsuarioOri));
        	call.setInt(ind++, Integer.parseInt(codEncargaturaOri));
        	call.setInt(ind++, Integer.parseInt(codUsuarioDest));
        	call.setInt(ind++, Integer.parseInt(codEncargaturaDest));
        	if (filtroBusquedaVO.getVista().equals(Constants.VISTA_RECIBIDOS))
        		call.setString(ind++, filtroBusquedaVO.getCodClasificacionDocu().trim().toUpperCase());
        	
            rs = call.executeQuery();

            int in=0;
            while(rs.next()){
            	//rs del sp
            	Documento docform = new Documento();
            	docform.setIndiceDocumento(String.valueOf(in++));
            	docform.setCodDocumento           (rs.getString("codDocumento"));
            	docform.setCodSeguimiento         (rs.getString("codSeguimiento"));
            	docform.setCodOfiElabDoc          (rs.getString("codOfiElabDoc"));
            	docform.setCodEmpElabDoc          (rs.getString("codEmpElabDoc"));
            	docform.setCodMovimiento          (rs.getString("codMovimiento"));
            	docform.setDescMovimiento         (rs.getString("descMovimiento").trim());
            	docform.setDescCortaMovimiento    (rs.getString("descCortaMovimiento").trim());
            	docform.setDescCortaTipoDocumento (rs.getString("descCortaTipoDocumento").trim());
            	docform.setDe                     (rs.getString("de").trim());
            	docform.setPara                   (rs.getString("para").trim());
            	docform.setCargoEmisor            (rs.getString("cargoEmisor").trim());
            	docform.setNombreEmpresa          (rs.getString("nombreEmpresa").trim());
            	docform.setAsunto                 (rs.getString("asunto").trim());
            	docform.setFechaVencimiento       (rs.getString("fechaVencimiento"));
            	docform.setFechaDocumento         (Util.getStrAsDate(rs.getString("fechaDocumento")));
            	docform.setFechaCreacion          (Util.getStrAsDate(rs.getString("fechaCreacion")));
            	docform.setHoraCreacion           (rs.getString("horaCreacion"));
            	docform.setFechaEnvio             (Util.getStrAsDate(rs.getString("fechaEnvio")));
            	docform.setNumDocumento           (rs.getString("numDocumento").trim());
            	docform.setNroRegDocumento        (rs.getString("nroRegDocumento").trim());
            	docform.setDescEstado             (rs.getString("descEstado").trim());
            	docform.setFlgProyecto            (rs.getString("flgProyecto"));
            	docform.setFlgProyectoElab        (rs.getString("flgProyectoElab"));
            	docform.setFlgArchivador          (rs.getString("flgProyectoElab"));
            	docform.setFlgGrabDoc             (rs.getString("flgGrabDoc"));
            	docform.setCodTipoDocumento       (rs.getString("codTipoDocumento"));
            	docform.setNumDestino             (rs.getString("numDestino"));
            	docform.setSiglasArea             (rs.getString("siglasArea").trim());
            	docform.setNombreArea             (rs.getString("nombreArea").trim());
            	docform.setCodEstado              (rs.getString("codEstado"));
            	docform.setCodUsuEmisor           (rs.getString("codUsuEmisor"));
            	docform.setDescTipoDocumento      (rs.getString("descTipoDocumento").trim());
            	docform.setCodPrioridad           (rs.getString("codPrioridad"));
            	docform.setCodFormaEnvio          (rs.getString("codFormaEnvio"));
            	docform.setFlgRespuesta           (rs.getString("flgRespuesta"));
            	docform.setFechaAviso             (rs.getString("fechaAviso"));
            	docform.setObservaciones          (rs.getString("observaciones").trim());
            	docform.setNumPlzDoc              (rs.getString("numPlzDoc"));
            	docform.setCodPlz                 (rs.getString("codPlz"));
            	docform.setFlgAnulado             (rs.getString("flgAnulado"));
            	docform.setFlgAtendidoManual      (rs.getString("flgAtendidoManual"));
            	docform.setFechaAtencion          (rs.getString("fechaAtencion"));
            	docform.setCodEstadoAtencion      (rs.getString("codEstadoAtencion"));
            	docform.setCodEntidadEmisor       (rs.getString("codEntidadEmisor"));
            	docform.setEmpEmisor              (rs.getString("empEmisor"));
            	docform.setCodEmpleadoCliente     (rs.getString("codEmpleadoCliente"));
            	docform.setDireccionCliente       (rs.getString("cliente_direccion").trim());
            	docform.setReferencia             (rs.getString("referencia").trim());
            	docform.setEstadoRecpDest         (rs.getString("estadoRecpDest").trim());
            	docform.setFlgImpresion           (rs.getString("flgImpresion"));
            	docform.setFlgArchivado           (rs.getString("flgArchivado"));
            	docform.setFlgArchivadoFavorito   (rs.getString("flgArchivadoFavorito"));
            	docform.setFlgArchivadoSerie      (rs.getString("flgArchivadoSerie"));
            	docform.setNumExpedienteAtencion  (rs.getString("numExpedienteAtencion").trim());
            	docform.setNombreEmpleadoElabDoc  (rs.getString("nombreEmpleadoElabDoc").trim());
            	docform.setCodClasificacionDocu   (rs.getString("clasificacionDocu").trim());
            	docform.setCodExpedienteBCA       (rs.getString("codExpedienteBCA"));
            	docform.setNumExpedienteBCA       (rs.getString("numExpedienteBCA").trim());
            	docform.setDiasVencimiento        (rs.getString("diasVencimiento").equals(Constants.VALOR_DEFAULT_CERO) ? Constants.VALOR_DEFAULT_VACIO : rs.getString("diasVencimiento"));
            	docform.setDescControlManual      (rs.getString("descControlManual"));
            	docform.setDescPrioridad          (rs.getString("descPrioridad"));
            	docform.setAniodoc(docform.getFechaDocumento() != null && !docform.getFechaDocumento().trim().equals("")? docform.getFechaDocumento().substring(6, 10) : "");
            	docform.setNumeroExpediente(rs.getString("numeroExpediente"));
            	
            	FiltroBusquedaVO filtroBusquedaVOSeg = new FiltroBusquedaVO();
            	filtroBusquedaVOSeg.setCodDocumento(docform.getCodDocumento());
            	filtroBusquedaVOSeg.setCodSeguimiento(docform.getCodSeguimiento());
            	SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
            	ArrayList lstDestinoDocumento = sqlSeguimientoDAO.listarSeguimientoDocumento(filtroBusquedaVOSeg);
            	docform.setLstDestinoDocumento(lstDestinoDocumento);
            	
            	lstDocumentos.add(docform);
            }
        }
        catch(Exception e)
        {
        	logger.error("[STD]: Error en listarReporteDocumentosRecibidos: " + e.getMessage());
            e.printStackTrace();
        }
        finally
	    {   
        	cn.destroy(conn,null,rs,call,pre);
	    }
		return lstDocumentos;
	}
	
	public ArrayList listarDocumentosPlazo(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentos = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null; 
		ResultSet rs = null;
	    try{
	    	
	    	conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_reporte_docs_x_vencer(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
	    	
	    	String codigoEmpleadoOficinaOrigen = filtroBusquedaVO.getCodigoEmpleadoOficinaOrigen();
	    	String codigoEmpleadoOficinaDestino = filtroBusquedaVO.getCodigoEmpleadoOficinaDestino();
	    	String codAuxOri = Constants.VALOR_DEFAULT_CERO;
    		String codEmpleadoOri = Constants.VALOR_DEFAULT_CERO;
    		String codUsuarioOri  = Constants.VALOR_DEFAULT_CERO;
    		String codOficinaOri  = Constants.VALOR_DEFAULT_CERO;
    		String codEncargaturaOri  = Constants.VALOR_DEFAULT_CERO;
    		String codAuxDest = Constants.VALOR_DEFAULT_CERO;
    		String codEmpleadoDest = Constants.VALOR_DEFAULT_CERO;
    		String codUsuarioDest  = Constants.VALOR_DEFAULT_CERO;
    		String codOficinaDest  = Constants.VALOR_DEFAULT_CERO;
    		String codEncargaturaDest  = Constants.VALOR_DEFAULT_CERO;
    		
    		if(!codigoEmpleadoOficinaOrigen.equals(Constants.VALOR_DEFAULT_CERO)){
    			codAuxOri = codigoEmpleadoOficinaOrigen.substring(codigoEmpleadoOficinaOrigen.indexOf("#")+1,codigoEmpleadoOficinaOrigen.lastIndexOf("#"));
	    		codEmpleadoOri = codAuxOri.substring(0,codAuxOri.indexOf("#"));
	    		codUsuarioOri  = codAuxOri.substring(codAuxOri.lastIndexOf("#")+1);
	    		codOficinaOri  = codigoEmpleadoOficinaOrigen.substring(0,codigoEmpleadoOficinaOrigen.indexOf("#"));
	    		codEncargaturaOri  = codigoEmpleadoOficinaOrigen.substring(codigoEmpleadoOficinaOrigen .lastIndexOf("#")+1);
    		}
    		if(!codigoEmpleadoOficinaDestino.equals(Constants.VALOR_DEFAULT_CERO)){
    			codAuxDest = codigoEmpleadoOficinaDestino.substring(codigoEmpleadoOficinaDestino.indexOf("#")+1,codigoEmpleadoOficinaDestino.lastIndexOf("#"));
    			codEmpleadoDest = codAuxDest.substring(0,codAuxDest.indexOf("#"));
    			codUsuarioDest  = codAuxDest.substring(codAuxDest.lastIndexOf("#")+1);
    			codOficinaDest  = codigoEmpleadoOficinaDestino.substring(0,codigoEmpleadoOficinaDestino.indexOf("#"));
    			codEncargaturaDest  = codigoEmpleadoOficinaDestino.substring(codigoEmpleadoOficinaDestino .lastIndexOf("#")+1);
    		}
    		
	    	int ind=1;
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getFlgBusquedaAvanzada()));
	    	call.setString(ind++, filtroBusquedaVO.getFechaProceso());
            call.setString(ind++, filtroBusquedaVO.getFechaInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaFin());
            call.setString(ind++, filtroBusquedaVO.getFechaCreacionInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaCreacionFin());
            call.setString(ind++, filtroBusquedaVO.getFechaEnvioInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaEnvioFin());
            call.setString(ind++, filtroBusquedaVO.getFechaVencimientoInicio());
            call.setString(ind++, filtroBusquedaVO.getFechaVencimientoFin());
            call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getEstadoDocumento()));
            call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodTipoMovimiento()));
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getNumProveido()));
	    	call.setString(ind++, filtroBusquedaVO.getNumDocumento().trim().toUpperCase());
	    	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodControlManual()));
            call.setString(ind++, filtroBusquedaVO.getFlgAnulado());
        	call.setString(ind++, filtroBusquedaVO.getNombreClienteOrigen().toUpperCase());
        	call.setString(ind++, filtroBusquedaVO.getEmpleadoClienteOrigen().toUpperCase());
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoOficinaOrigen()));
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoEmpleadoOficinaOrigen()));
        	call.setString(ind++, filtroBusquedaVO.getNombreClienteDestino().toUpperCase());
        	call.setString(ind++, filtroBusquedaVO.getEmpleadoClienteDestino().toUpperCase());
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoOficinaDestino()));
        	call.setInt(ind++, Integer.parseInt(filtroBusquedaVO.getCodigoEmpleadoOficinaDestino()));
        	call.setString(ind++, filtroBusquedaVO.getAsunto().trim().toUpperCase());
        	call.setString(ind++, filtroBusquedaVO.getReferencia().trim().toUpperCase());
        	call.setInt(ind++, Integer.parseInt(codUsuarioOri));
        	call.setInt(ind++, Integer.parseInt(codEncargaturaOri));
        	call.setInt(ind++, Integer.parseInt(codUsuarioDest));
        	call.setInt(ind++, Integer.parseInt(codEncargaturaDest));
        	
            rs = call.executeQuery();

            int in=0;
            while(rs.next()){
            	//rs del sp

            	Documento docform = new Documento();
            	docform.setIndiceDocumento(String.valueOf(in++));
            	docform.setCodDocumento           (rs.getString("codDocumento"));
            	docform.setCodSeguimiento         (rs.getString("codSeguimiento"));
            	docform.setCodOfiElabDoc          (rs.getString("codOfiElabDoc"));
            	docform.setCodEmpElabDoc          (rs.getString("codEmpElabDoc"));
            	docform.setCodMovimiento          (rs.getString("codMovimiento"));
            	docform.setDescMovimiento         (rs.getString("descMovimiento").trim());
            	docform.setDescCortaMovimiento    (rs.getString("descCortaMovimiento").trim());
            	docform.setDescCortaTipoDocumento (rs.getString("descCortaTipoDocumento").trim());
            	docform.setDe                     (rs.getString("de").trim());
            	docform.setPara                   (rs.getString("para").trim());
            	docform.setCargoEmisor            (rs.getString("cargoEmisor").trim());
            	docform.setNombreEmpresa          (rs.getString("nombreEmpresa").trim());
            	docform.setAsunto                 (rs.getString("asunto").trim());
            	docform.setFechaVencimiento       (Util.getStrAsDate(rs.getString("fechaVencimiento")));
            	docform.setFechaDocumento         (Util.getStrAsDate(rs.getString("fechaDocumento")));
            	docform.setFechaCreacion          (Util.getStrAsDate(rs.getString("fechaCreacion")));
            	docform.setHoraCreacion           (rs.getString("horaCreacion"));
            	docform.setFechaEnvio             (Util.getStrAsDate(rs.getString("fechaEnvio")));
            	docform.setNumDocumento           (rs.getString("numDocumento").trim());
            	docform.setNroRegDocumento        (rs.getString("nroRegDocumento").trim());
            	docform.setDescEstado             (rs.getString("descEstado").trim());
            	docform.setFlgProyecto            (rs.getString("flgProyecto"));
            	docform.setFlgProyectoElab        (rs.getString("flgProyectoElab"));
            	docform.setFlgArchivador          (rs.getString("flgProyectoElab"));
            	docform.setFlgGrabDoc             (rs.getString("flgGrabDoc"));
            	docform.setCodTipoDocumento       (rs.getString("codTipoDocumento"));
            	docform.setNumDestino             (rs.getString("numDestino"));
            	docform.setSiglasArea             (rs.getString("siglasArea").trim());
            	docform.setNombreArea             (rs.getString("nombreArea").trim());
            	docform.setCodEstado              (rs.getString("codEstado"));
            	docform.setCodUsuEmisor           (rs.getString("codUsuEmisor"));
            	docform.setDescTipoDocumento      (rs.getString("descTipoDocumento").trim());
            	docform.setCodPrioridad           (rs.getString("codPrioridad"));
            	docform.setCodFormaEnvio          (rs.getString("codFormaEnvio"));
            	docform.setFlgRespuesta           (rs.getString("flgRespuesta"));
            	docform.setFechaAviso             (rs.getString("fechaAviso"));
            	docform.setObservaciones          (rs.getString("observaciones").trim());
            	docform.setNumPlzDoc              (rs.getString("numPlzDoc"));
            	docform.setCodPlz                 (rs.getString("codPlz"));
            	docform.setFlgAnulado             (rs.getString("flgAnulado"));
            	docform.setFlgAtendidoManual      (rs.getString("flgAtendidoManual"));
            	docform.setFechaAtencion          (rs.getString("fechaAtencion"));
            	docform.setCodEstadoAtencion      (rs.getString("codEstadoAtencion"));
            	docform.setCodEntidadEmisor       (rs.getString("codEntidadEmisor"));
            	docform.setEmpEmisor              (rs.getString("empEmisor"));
            	docform.setCodEmpleadoCliente     (rs.getString("codEmpleadoCliente"));
            	docform.setDireccionCliente       (rs.getString("cliente_direccion").trim());
            	docform.setReferencia             (rs.getString("referencia").trim());
            	docform.setEstadoRecpDest         (rs.getString("estadoRecpDest").trim());
            	docform.setFlgImpresion           (rs.getString("flgImpresion"));
            	docform.setFlgArchivado           (rs.getString("flgArchivado"));
            	docform.setFlgArchivadoFavorito   (rs.getString("flgArchivadoFavorito"));
            	docform.setFlgArchivadoSerie      (rs.getString("flgArchivadoSerie"));
            	docform.setNumExpedienteAtencion  (rs.getString("numExpedienteAtencion").trim());
            	docform.setNombreEmpleadoElabDoc  (rs.getString("nombreEmpleadoElabDoc").trim());
            	docform.setCodClasificacionDocu   (rs.getString("clasificacionDocu").trim());
            	docform.setCodExpedienteBCA       (rs.getString("codExpedienteBCA"));
            	docform.setNumExpedienteBCA       (rs.getString("numExpedienteBCA").trim());
            	docform.setDiasVencimiento        (rs.getString("diasVencimiento").equals(Constants.VALOR_DEFAULT_CERO) ? Constants.VALOR_DEFAULT_VACIO : rs.getString("diasVencimiento"));
            	docform.setDescControlManual      (rs.getString("descControlManual"));
            	docform.setDescPrioridad          (rs.getString("descPrioridad"));
            	docform.setNumDiasVencidos        (rs.getString("numDiasParaVenc"));
            	docform.setAniodoc(docform.getFechaDocumento() != null && !docform.getFechaDocumento().trim().equals("")? docform.getFechaDocumento().substring(6, 10) : "");
            	docform.setNumeroExpediente(rs.getString("numeroExpediente"));
            	
            	FiltroBusquedaVO filtroBusquedaVOSeg = new FiltroBusquedaVO();
            	filtroBusquedaVOSeg.setCodDocumento(docform.getCodDocumento());
            	filtroBusquedaVOSeg.setCodSeguimiento(docform.getCodSeguimiento());
            	filtroBusquedaVOSeg.setCodigoOficinaDestino(rs.getString("codigoOficinaDestino"));//agregado para filtrar destino
            	SQLSeguimientoDAO sqlSeguimientoDAO = new SQLSeguimientoDAO();
            	ArrayList lstDestinoDocumento = sqlSeguimientoDAO.listarSeguimientoDocumentoPendientePorEmplOficinaDestino(filtroBusquedaVOSeg);
            	docform.setLstDestinoDocumento(lstDestinoDocumento);
            	if(lstDestinoDocumento.size()>0)
            	lstDocumentos.add(docform);
            }
        }
        catch(Exception e)
        {
        	logger.error("[STD]: Error en listarReporteDocumentosRecibidos: " + e.getMessage());
            e.printStackTrace();
        }
        finally
	    {   
        	cn.destroy(conn,null,rs,call,pre);
	    }
		return lstDocumentos;
	}
}

